﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;


namespace ns
{

   



    /// <summary>
    /// 给定一个整数数组 nums 和一个目标值 target，请你在该数组中找出和为目标值的那 两个 整数，并返回他们的数组下标。
    /// 你可以假设每种输入只会对应一个答案。但是，你不能重复利用这个数组中同样的元素。
    /// 示例:
    /// 给定 nums = [2, 7, 11, 15], target = 9
    /// 因为 nums[0] + nums[1] = 2 + 7 = 9
    /// 所以返回[0, 1]
    /// 来源：力扣（LeetCode）
    /// 链接：https://leetcode-cn.com/problems/two-sum
    /// 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
    /// </summary>
    
    public class TwoSum0001 : MonoBehaviour
    {




        //变量
        public int[] nums;
        public int target;


        /// <summary>
        /// 暴力法：两数之和
        /// </summary>
        /// <param name="nums">整数数组</param>
        /// <param name="target">目标值</param>
        /// <returns>异常或者范围整数数组[i,j]</returns>
        public int[] TwoSum(int[] nums, int target)
        {
            for (int i = 0; i < nums.Length; i++)
            {
                for (int j = i + 1; j < nums.Length; j++)
                {
                    if (nums[i] + nums[j] == target)
                    {
                        return new int[] { i, j };
                    }
                }
            }//抛出异常
            throw new System.Exception("No Two Sum Resolution");
        }

        /// <summary>
        /// 两遍哈希表
        /// </summary>
        /// <param name="nums"></param>
        /// <param name="target"></param>
        /// <returns></returns>
        public int[] TwoSumHash(int[] nums, int target)
        {
            Hashtable hashtable= new Hashtable();
            //第一遍迭代将指定的键KEY和值VALUE存储到哈希表
            for (int i = 0; i < nums.Length; i++)
            {
                //键，值( 值 ，索引)
                hashtable.Add(nums[i],i);
            }
            for (int i = 0; i < nums.Length; i++)
            {
                //complement这里充当的事键Key
                int complement = target - nums[i];
                if (hashtable.ContainsKey(complement) && (int)hashtable[complement] != i)
                {
                    //需要将object类型将至转换成int类型
                    return new int[] {i,(int)hashtable[complement] };
                }

            }
            throw new System.Exception("No Two Sum Resolution22222222");
        }


        private void OnGUI()
        {
            if (GUI.Button(new Rect(50, 50, 100, 30), "测试"))
            {
                //int[] result = TwoSum(nums, target);
                int[] result2 = TwoSumHash(nums, target);
                foreach (var item in result2)
                {
                    Debug.Log(item);
                }
            }        
        }


    }

}
